package com.itheima.reggie.web;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//@webFilter tomcat,web阶段的注解 作用 web项目启动的时候 会发现这个注解
//就会 创建Filter对象 现在 对象交给spring 搞了
 //spring是不是得能发现 web里面规定的注解
//spring 容器默认的扫描能扫到它吗 不能
//需要在 springboot 引导类中 开启对 web里面规定的组件 注解进行扫描
@WebFilter(filterName = "LoginCheckFilter")
//默认写的过滤器是拦截所有请求
@Slf4j //日志打印
public class LoginCheckFilter implements Filter {

     //把需要放行的(认证过的 )路径 方到一个数组中 进行统一管理
    private String[] authUrl = new String[]{
             "/backend/**",
             "/front/**",
             "/employee/login",
             "/employee/logout",
             "/common/**",
             "/user/sendMsg",
             "/user/login"
     };
    //获取拦截请求路径 去匹配 上面认证过的路径数组
    //如果蒲培成功 返回true
    //如果匹配失败 返回false
     private boolean isCheckUri(String uri) {
         //请求路径和认证路径进行判断
         //有没有一个对象可以判断路径是否匹对
         AntPathMatcher antPathMatcher = new AntPathMatcher();
         for ( String s : authUrl) {
             //认证路径和请求路径一一匹对
             if (antPathMatcher.match(s,uri)){ //是true 就返回true
                 return true;
             }
         }
         return false;
     }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //向下转型  用里面的方法

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse)resp;
        //获取本次请求的url
        String uri = request.getRequestURI();
        log.info(uri+"过滤器被拦截住了");
        //拿到请求路径跟认证的路径 作比对 快速创建一个方法关于(uri参数的方法)
        boolean isCheck = isCheckUri(uri);
        if (isCheck){
            chain.doFilter(request, response);
            return;
        }
        //判断用户是否是登录状态获取session中有个employee 有就是登录 没有就是没登录
        Object employee = request.getSession().getAttribute("employee");
        //前台
        Object user = request.getSession().getAttribute("user");
        //将session域中的id 存入线程的局部变量中 这样只要在一次请求中都可以获取用户的id了
        if (employee!=null){
            BaseContext.setCurrentId((Long) employee);
            log.info("[该用户登录着呢,可以放行]"+employee);
            chain.doFilter(request, response);
            return;
        }
        if (user!=null){
            //强转为Long类型
            BaseContext.setCurrentId((Long) user);
            log.info("[该用户登录着呢,可以放行]"+user);
            chain.doFilter(request, response);
            return;
        }
        log.info("[没登录,没有权限,请登录]");
        R r = R.error("NOTLOGIN");
        String s = JSON.toJSONString(r);
        response.getWriter().write(s);

    }




    public void destroy() {
    }

    public void init(FilterConfig config) throws ServletException {

    }

}
